package leetcode.year2021.month11;
// 198. 打家劫舍
public class _01_1Rob198 {
  public int rob(int[] nums) {
    // 使用动态规划，可以得到动态转移方程
    // 如果偷窃第 i 间房屋，那么能得到的最大金额就是  dp[i-2] + f[i]
    // 如果不偷窃第 i 间房屋，那么能得到的最大金额就是 dp[i-1]
    int length = nums.length;
    if (length == 1){
      return nums[0];
    }
    if (length == 2){
      return Math.max(nums[0], nums[1]);
    }

    int[] dps = new int[length];
    dps[0] = nums[0];
    dps[1] = Math.max(nums[0],nums[1]);
    int ans = Math.max(dps[0],dps[1]);
    for (int i = 2; i < nums.length; i++) {
      dps[i] = Math.max(dps[i-1],dps[i-2]+nums[i]);
      ans = Math.max(ans,dps[i]);
    }
    return ans;
  }


  /**
   * 198. 打家劫舍
   * 你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
   *
   * 给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
   *
   *
   *
   * 示例 1：
   *
   * 输入：[1,2,3,1]
   * 输出：4
   * 解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。
   *      偷窃到的最高金额 = 1 + 3 = 4 。
   * 示例 2：
   *
   * 输入：[2,7,9,3,1]
   * 输出：12
   * 解释：偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9)，接着偷窃 5 号房屋 (金额 = 1)。
   *      偷窃到的最高金额 = 2 + 9 + 1 = 12 。
   *
   *
   * 提示：
   *
   * 1 <= nums.length <= 100
   * 0 <= nums[i] <= 400
   */
}
